package com.hxm.demo.netty.nio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author huangxiaoming
 * @description TODO
 * @date 2020年07月25日 08:47:00
 */
public class NioCopyFile {
    public static void main(String[] args) throws IOException {
        String infile = "GitHub.txt";
        String outfile = "GitHub2.txt";

        // 获取源文件和目标文件的输入输出流
        FileInputStream fin = null;
        FileOutputStream fout = null;
        FileChannel fcin = null;
        FileChannel fcout = null;
        try {
            fin = new FileInputStream(infile);
            fout = new FileOutputStream(outfile);

            // 获取输入输出通道
            fcin = fin.getChannel();
            fcout = fout.getChannel();

            // 创建缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(1024);

            while (true) {
                // clear方法重设缓冲区，使它可以接受读入的数据
                buffer.clear();
                // 从输入通道中将数据读到缓冲区
                int r = fcin.read(buffer);
                // read方法返回读取的字节数，可能为零，如果该通道已到达流的末尾，则返回-1
                if (r == -1) {
                    break;
                }
                // flip方法让缓冲区可以将新读入的数据写入另一个通道
                buffer.flip();
                // 从输出通道中将数据写入缓冲区
                fcout.write(buffer);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fin != null){
                fcin.close();
            }
            if (fout != null){
                fout.close();
            }
            if (fcin != null){
                fcin.close();
            }
            if (fcout != null){
                fcout.close();
            }
        }


    }
}
